package com.xbongbong.saas.model;


import com.alibaba.fastjson.JSONObject;
import com.xbongbong.aiassistant.domain.entity.AiCustomerEntity;
import com.xbongbong.paas.domain.entity.PaasFormDataEntity;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.pro.businessdata.pojo.dto.FormatExplainDTO;
import com.xbongbong.pro.domain.entity.SpecialUpdateCustomerDataEntity;
import com.xbongbong.pro.domain.entity.UpdateDataEntity;
import com.xbongbong.pro.formdata.pojo.dto.SaasAnalysisDataDTO;
import com.xbongbong.saas.domain.entity.FineClueScriptEntity;
import com.xbongbong.saas.domain.entity.RuleCustomerEntity;
import com.xbongbong.saas.domain.entity.ext.CustomerEntityExt;
import com.xbongbong.saas.enums.business.CustomerCommunicateEnum;
import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.search.sort.SortOrder;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author feng.zheng
 * @version v1.0
 * @date 2019/1/22 16:44
 * @since v1.0
 */
public interface CustomerModel extends IModel<CustomerEntityExt> {
    /**
     * 客户数据单条查询
     * @param key 主键ID
     * @param corpid 公司ID
     * @author feng.zheng
     * @date 2019/1/23 20:27
     * @since v1.0
     * @return Integer
     */
    CustomerEntityExt getByKey(Long key, String corpid);

    /**
     * 客户数据单条查询
     * @param keys 主键ID集合
     * @param corpid 公司ID
     * @author feng.zheng
     * @date 2019/1/23 20:27
     * @since v1.0
     * @return Integer
     */
    List<CustomerEntityExt> getByKeys(List<Long> keys, String corpid);

    /**
     * 客户查询多个
     * @param param 参数
     * @return List<CustomerEntityExt>
     * @author long.rao
     * @date 2019-02-01 15:22
     */
    @Override
    List<CustomerEntityExt> findEntitys(Map<String, Object> param);


    /**
     * 获取符合查询条件的记录总数
     * @param param 查询条件
     * @return java.lang.Integer 符合查询条件的记录总数
     * @author zcp
     * @date 2019/4/17 9:42
     * @since v1.0
     * @version v1.0
     */
    @Override
    Integer getEntitysCount(Map<String ,Object>  param);

    /**
     * 按手机号查询客户
     * @param phone 用于判重的手机号
     * @param corpid 公司ID
     * @author youli.chen
     * @date 2019/1/23 20:27
     * @since v1.0
     * @return CustomerEntityExt
     */
    CustomerEntityExt getByPhone(String corpid, String phone) throws XbbException;
    /**
     * 按手机号查询客户
     * @param phone 用于判重的手机号
     * @param corpid 公司ID
     * @author youli.chen
     * @date 2019/1/23 20:27
     * @since v1.0
     * @return CustomerEntityExt
     */
    CustomerEntityExt getByPhoneIncloudRecycled(String corpid, String phone) throws XbbException;

    /**
     * Description: 根据 时间 字段查询（一天内的）的客户
     * @param corpid 公司id
     * @param attr attr字段
     * @param formId 表单id
     * @param time 时间
     * @return java.util.List<java.lang.Long>
     * @author 魏荣杰
     * @date 2019/2/18 17:29
     * @since v1.0
     */
    List<CustomerEntityExt> getCustomerByDateInOneDay(String corpid, String attr, Long formId, Long time);



    /**
     * @Description: 获取员工主负责的客户列表
     * @param corpid 公司id
     * @param idIn
     * @param menuId
     * @return
     * 创建时间： 2018-5-23 下午4:12:29
     * 修改时间： 2018-5-23 下午4:12:29 chy
     * @author chy
     * @since v3.22
     * @version v3.22
     */
    List<RuleCustomerEntity> getMainCustomerList4Rule(String corpid, List<Long> idIn, Long menuId);

    /**
     * @Description: 获取员工主负责的客户列表
     * @param corpid 公司id
     * @param userId 员工id
     * @param importantDegreeInt 重要程度
     * @param pageNum 页数
     * @param pageSize 分页大小
     * @param orderField 排序字段
     * @param sortList 排序方式 排序字段的顺序 [1, 2, 3] [1, 3, 2]
     * @param customerIdIn 客户id集合
     * @param menuId
     * @return
     * 创建时间： 2018-5-23 下午4:12:29
     * 修改时间： 2018-5-23 下午4:12:29 chy
     * @author chy
     * @since v3.22
     * @version v3.22
     */
    List<RuleCustomerEntity> getMainCustomerListByUserId(String corpid, String userId, Integer importantDegreeInt, Integer pageNum, Integer pageSize, String orderField, List<Integer> sortList, List<Long> customerIdIn, Long menuId) throws XbbException;

    /**
     * @Description: 获取员工主负责的客户数
     * @param corpid 公司id
     * @param userId 员工id
     * @param importantDegree 重要程度 为1时，比较特殊，代表1星及以下
     * @return
     * 创建时间： 2018-5-23 下午4:12:37
     * 修改时间： 2018-5-23 下午4:12:37 chy
     * @author chy
     * @since v3.22
     * @version v3.22
     */
    Integer getMainCustomerCountByUserId(String corpid, String userId, Integer importantDegree) throws XbbException;

    /**
     * 批量更新
     * @author 吴峰
     * @date 2019/3/14 11:34
     * @param updateDataList
     * @param corpid 公司id
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    Integer updateBatch(List<UpdateDataEntity> updateDataList, String corpid) throws XbbException;

    Integer updateBatch(List<UpdateDataEntity> updateDataList, String corpid, WriteRequest.RefreshPolicy refreshPolicy) throws XbbException;

    Integer restoreBatch(List<Long> dataIdList, String corpid, Integer del) throws XbbException;

    /**
     * 删除客户进回收站，默认es等待
     * @param deleteList
     * @param corpid
     * @return
     * @throws XbbException
     */
    Integer deleteBatch(List<Long> deleteList, String corpid) throws XbbException;

    /**
     * 删除客户进回收站
     * @param deleteList
     * @param corpid
     * @param refreshPolicy
     * @return
     * @throws XbbException
     */
    Integer deleteBatch(List<Long> deleteList, String corpid, WriteRequest.RefreshPolicy refreshPolicy) throws XbbException;
    /**
     * 彻底删除
     * @author 吴峰
     * @date 2019/3/28 17:14
     * @param dataIdList 数据id列表
     * @param corpid 公司id
     * @param del 删除标识
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    Integer thoroughDeleteBatch(List<Long> dataIdList, String corpid, Integer del) throws XbbException;

    /**
     *
     * @param customerEntityExtList
     * @return
     * @throws XbbException
     */
    void insertBatch(List<PaasFormDataEntity> customerEntityExtList, boolean isImport) throws XbbException;

    /**
     * 获取智能助手需要的客户数据
     *
     * @param corpid 公司id
     * @param idIn 数据ids
     * @return
     * @throws
     * @author hongxiao
     * @date: 2020-02-24 16:50
     * @since v4.13.0
     * @version v4.13.0
     */
    List<AiCustomerEntity> getCustomerList4Ai(String corpid, List<Long> idIn);

    List<CustomerEntityExt> findEntitysWithoutSub(Map<String, Object> param);

    /**
     * 编辑时格式化解释
     *
     * @param formatExplainDTO 入参
     * @throws XbbException 异常
     * @author long.rao
     * @date 2019-06-15 13:59
     */
    void formatUpdateExplain(FormatExplainDTO formatExplainDTO) throws XbbException;

    /**
     * 编辑时将获取数据格式化
     *
     * @param saasAnalysisDataDTO saas编辑数据
     * @param result               要返回的jsonobject
     * @throws XbbException 业务异常
     * @author feng.zheng
     * @date 2019/1/22 15:28
     */
    void formatData(SaasAnalysisDataDTO saasAnalysisDataDTO, JSONObject result) throws XbbException;

    /**
     * 编辑时格式化解释
     *
     * @param formatExplainDTO 入参
     * @throws XbbException 异常
     * @author long.rao
     * @date 2019-06-15 13:59
     */
    void formatUpdateExplainForDistributor(FormatExplainDTO formatExplainDTO) throws XbbException;

    /**
     * 根据号码集合查询客户
     *
     * @param corpid       公司ID
     * @param phoneList    号码集合
     * @param dontQueryDel 不查询del
     * @return 客户集合
     * @throws XbbException 异常
     */
    List<CustomerEntityExt> listByInPhone(String corpid, List<String> phoneList, Boolean dontQueryDel) throws XbbException;
    /**
     * 刷精线索脚本使用
     *
     * @param corpid
     * @param pids
     * @return
     */
    List<FineClueScriptEntity> getListByPids(String corpid, List<String> pids);

    /**
     * 通过json_set语句改变data的多个值
     * 该值必须是data下一级的值
     * 并且更新更新时间
     *
     * @param corpid 公司id
     * @param id 数据的id
     * @param map 需要更新的值
     */
    void jsonsetNoSubById(String corpid, Long id, Map<String,Object> map) throws XbbException;

    /**
     * 更改团队相关信息，需要去更新主表更新时间
     *
     * @param customerEntityExt
     * @return
     * @throws XbbException
     */
    Integer updateByChangeTeam(CustomerEntityExt customerEntityExt) throws XbbException;

    /**
     * 更新客户表的更新时间，包含数据库和es
     *
     * @param id
     * @param corpid
     * @return
     * @throws XbbException
     */
    void updateTime(Long id,String corpid) throws XbbException;

    /**
     * 刷脚本用来更新最后签订时间和机会创建时间
     * @param updateDataEntityList
     * @return
     * @throws XbbException
     */
    Integer updateBatch4Script(List<SpecialUpdateCustomerDataEntity> updateDataEntityList) throws XbbException;


    /**
     * 用来特殊处理更新sysDate1,sysDate2字段
     * @param id
     * @param dataJSONObject
     * @param corpid
     * @return
     * @throws XbbException
     */
    Integer specialUpdate4SysDate(Long id, JSONObject dataJSONObject, String corpid) throws XbbException;
    Long getMaxId() throws XbbException;

    /**
     * 获取客户
     *
     * @param corpid     公司id
     * @param formId 表单id
     * @param boolQueryBuilder 查询条件
     * @param clazz 返回的实体
     * @param orderField 排序字段 示例：如果是data中的字段，请用data.text_1，data外则无需data.
     * @see SortOrder
     * @param sortOrder 排序
     * @return List
     * @author 吴峰
     * @date 2023/3/21 15:32
     * @since V1.0
     * @throws XbbException
     */
    <T> List<T> getCustomerListByLinkIdIn(String corpid, Long formId, BoolQueryBuilder boolQueryBuilder, Class<T> clazz, String orderField, SortOrder sortOrder,  Integer page, Integer pageSize) throws XbbException;

}
